package cn.zch.tags.stack;
/**
 * @author zchcpywin10
 * //给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串，判断字符串是否有效。
 * //
 * // 有效字符串需满足：
 * //
 * //
 * // 左括号必须用相同类型的右括号闭合。
 * // 左括号必须以正确的顺序闭合。
 * //
 * //
 * // 注意空字符串可被认为是有效字符串。
 * //
 * // 示例 1:
 * //
 * // 输入: "()"
 * //输出: true
 * //
 * //
 * // 示例 2:
 * //
 * // 输入: "()[]{}"
 * //输出: true
 * //
 * //
 * // 示例 3:
 * //
 * // 输入: "(]"
 * //输出: false
 * //
 * //
 * // 示例 4:
 * //
 * // 输入: "([)]"
 * //输出: false
 * //
 * //
 * // 示例 5:
 * //
 * // 输入: "{[]}"
 * //输出: true
 * // Related Topics 栈 字符串
 * // 👍 2079 👎 0
 */
public class CheckBracketsPairingMine {
  /**
   * Brackets little medium big left right
   */
  private static final char B_L_L = '(';
  private static final char B_L_R = ')';
  private static final char B_M_L = '[';
  private static final char B_M_R = ']';
  private static final char B_B_L = '{';
  private static final char B_B_R = '}';
  private static final int STR_LENGTH_EVEN = 2;
  public static boolean isValid(String s) {
    boolean result1 = true;
    boolean result2 = true;
    if (s.length() < STR_LENGTH_EVEN) {
      return false;
    }
    if ((s.length() % STR_LENGTH_EVEN) != 0) {
      return false;
    }
    for (int i = 0; i < (s.length() / STR_LENGTH_EVEN); i++) {
      int sLength = s.length();
      char cl = s.charAt(i);
      char cr = s.charAt(sLength - 1 - i);
      if (checkPairing(cl, cr)) {
        result1 = false;
        break;
      }
    }
    for (int i = 0; i < (s.length()); i = i + STR_LENGTH_EVEN) {
      char cl = s.charAt(i);
      char cr = s.charAt(i + 1);
      if (checkPairing(cl, cr)) {
        result2 = false;
        break;
      }
    }
    return (result1 || result2);
  }
  /**
   * PositiveInvertedSequence
   */
  public static boolean checkPairing(char cl, char cr) {
    if (cl == B_L_L) {
      return cr != B_L_R;
    }
    else if (cl == B_M_L) {
      return cr != B_M_R;
    }
    else if (cl == B_B_L) {
      return cr != B_B_R;
    }
    else if (cl == B_L_R || cl == B_M_R || cl == B_B_R || cl == cr) {
      return true;
    }
    else {
      return true;
    }
  }
}
